package com.example.common.mvi

import android.os.Bundle
import androidx.databinding.ViewDataBinding
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import com.example.common.base.BaseActivity
import com.example.common.event.CustomEvent
import kotlinx.coroutines.launch
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode

abstract class BaseMviActivity<T:ViewDataBinding>:BaseActivity<T>() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //初始化数据
        initData()
        //更新UI
        updateUi()
        //注册EventBus,用于发送和接受事件
        EventBus.getDefault().register(this)
    }




    override fun onDestroy() {
        //取消EventBus注册
        EventBus.getDefault().unregister(this)
        super.onDestroy()
    }
    //订阅事件接受方法
    @Subscribe(threadMode = ThreadMode.MAIN)
    fun receiveEvent(event:CustomEvent){
        if(event!=null && event.target === this::class.java.simpleName){
            handEvent(event)
        }

    }
    //让子类来处理EventBus事件
    open fun handEvent(event: CustomEvent){

    }
    /**
     * 初始化数据
     * 协程作用域：
     * LifecycleScope 具备生命周期感知能力的协程作用域
     * GlobalScope 应用级别的协程作用域，很容易导致程序挂掉，需要谨慎使用
     * ViewModelScope 只能在ViewModel中使用
     * MainScope 主线程中的协程作用域
     * CoroutineScope 普通协程作用域
     * runBlacking函数，默认是普通协程作用域
     */
    private fun initData(){
        lifecycleScope.launch {
         //在Activity生命周期onCreate执行后
            lifecycle.repeatOnLifecycle(Lifecycle.State.CREATED){
                sendViewIntent()
            }
        }
    }



    private fun updateUi(){
        //使用生命周期感知能力协程作用域启动协程更新UI
        lifecycleScope.launch {
            //在Activity生命周期onStart执行后
            lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED){
                collectUiState()
            }
        }
    }
    /**
     * 收集UI状态变化（可选）
     */
    open suspend fun collectUiState(){

    }
    //收集UI状态变化(可选)

    open suspend fun sendViewIntent(){

    }
}